Learn Haskell in Y Minutes

您所在的位置:网站首页 haskell doc Learn Haskell in Y Minutes

Learn Haskell in Y Minutes

2023-10-12 23:39| 来源: 网络整理| 查看: 265

Haskell 是一门实用的函数式编程语言,因其 Monads 与类型系统而闻名。而我使用它则是因为它异常优雅。用 Haskell 编程令我感到非常快乐。

-- 单行注释以两个减号开头 {- 多行注释像这样 被一个闭合的块包围 -} ---------------------------------------------------- -- 1. 简单的数据类型和操作符 ---------------------------------------------------- -- 数字 3 -- 3 -- 数学计算 1 + 1 -- 2 8 - 1 -- 7 10 * 2 -- 20 35 / 5 -- 7.0 -- 默认除法不是整除 35 / 4 -- 8.75 -- 整除 35 `div` 4 -- 8 -- 布尔值 True False -- 布尔操作 not True -- False not False -- True 1 == 1 -- True 1 /= 1 -- False 1 Bool -- 这是接受两个参数的函数 -- add :: Integer -> Integer -> Integer -- 当你定义一个值,声明其类型是一个好做法 double :: Integer -> Integer double x = x * 2 ---------------------------------------------------- -- 6. 控制流和 If 语句 ---------------------------------------------------- -- if 语句: haskell = if 1 == 1 then "awesome" else "awful" -- haskell = "awesome" -- if 语句也可以有多行,注意缩进: haskell = if 1 == 1 then "awesome" else "awful" -- case 语句 -- 解析命令行参数: case args of "help" -> printHelp "start" -> startProgram _ -> putStrLn "bad args" -- Haskell 没有循环,它使用递归 -- map 对一个列表中的每一个元素调用一个函数 map (*2) [1..5] -- [2, 4, 6, 8, 10] -- 你可以使用 map 来编写 for 函数 for array func = map func array -- 调用 for [0..5] $ \i -> show i -- 我们也可以像这样写 for [0..5] show -- 你可以使用 foldl 或者 foldr 来分解列表 -- foldl foldl (\x y -> 2*x + y) 4 [1,2,3] -- 43 -- 等价于 (2 * (2 * (2 * 4 + 1) + 2) + 3) -- foldl 从左开始,foldr 从右 foldr (\x y -> 2*x + y) 4 [1,2,3] -- 16 -- 现在它等价于 (2 * 3 + (2 * 2 + (2 * 1 + 4))) ---------------------------------------------------- -- 7. 数据类型 ---------------------------------------------------- -- 在 Haskell 中声明你自己的数据类型: data Color = Red | Blue | Green -- 现在你可以在函数中使用它: say :: Color -> String say Red = "You are Red!" say Blue = "You are Blue!" say Green = "You are Green!" -- 你的数据类型也可以有参数: data Maybe a = Nothing | Just a -- 这些都是 Maybe 类型: Just "hello" -- `Maybe String` 类型 Just 1 -- `Maybe Int` 类型 Nothing -- 对任意 `a` 为 `Maybe a` 类型 ---------------------------------------------------- -- 8. Haskell IO ---------------------------------------------------- -- 虽然不解释 Monads 就无法完全解释 IO,但大致了解并不难。 -- 当执行一个 Haskell 程序时,函数 `main` 就被调用。 -- 它必须返回一个类型 `IO ()` 的值。例如: main :: IO () main = putStrLn $ "Hello, sky! " ++ (say Blue) -- putStrLn 的类型是 String -> IO () -- 如果你的程序输入 String 返回 String,那样编写 IO 是最简单的。 -- 函数 -- interact :: (String -> String) -> IO () -- 输入一些文本,对其调用一个函数,并打印输出。 countLines :: String -> String countLines = show . length . lines main' = interact countLines -- 你可以认为一个 `IO ()` 类型的值是表示计算机做的一系列操作,类似命令式语言。 -- 我们可以使用 `do` 声明来把动作连接到一起。 -- 举个列子 sayHello :: IO () sayHello = do putStrLn "What is your name?" name IO String -- 我们可以像调用 `getLine` 一样调用它 main'' = do putStrLn "I will echo two lines!" result :t foo foo :: Integer -- 你也可以运行任何 `IO ()`类型的动作 > sayHello What is your name? Friend! Hello, Friend!

Haskell 还有许多内容,包括类型类 (typeclasses) 与 Monads。这些都是令 Haskell 编程非常有趣的好东西。我们最后给出 Haskell 的一个例子,一个快速排序的实现:

qsort [] = [] qsort (p:xs) = qsort lesser ++ [p] ++ qsort greater where lesser = filter (= p) xs

安装 Haskell 很简单。你可以从这里获得。

你可以从优秀的 Learn you a Haskell 或者 Real World Haskell 找到更平缓的入门介绍。

有建议?或者发现什么错误?在Github上开一个issue,或者发起pull request!

原著Adit Bhargava,并由0个好心人修改。

Creative Commons License

© 2023 Adit Bhargava

Translated by: Peiyong Lin chad luo



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3